package br.com.as.dao;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;

import br.com.as.dominio.Produto;
import br.com.as.utils.AsUtils;
import br.com.as.utils.HibernateUtility;
import br.com.as.vo.ProdutoVendido;

/**
 * Classe para consistencia de produto
 * 
 * @author msante
 *
 */
public class ProdutoDAO {

	@SuppressWarnings("unchecked")
	public  List<Produto> listar() throws Exception{
		List<Produto> lista = null;
		Session sessao = HibernateUtility.getSession();
		Transaction tx = null;
		try {
			tx = sessao.beginTransaction();
			Query query = sessao.createQuery(" from Produto ");		
			lista = query.list();			
			tx.commit();			
		} catch (Exception e) {			
			tx.rollback();
			throw e;
		} finally {
			sessao.close();
		}
		return lista;
	}
	
	public  void incluir(Produto produto) throws Exception{
		Transaction tx = null;
		Session sessao = HibernateUtility.getSession();
		try {			
			tx = sessao.beginTransaction();			
			sessao.save(produto);
			tx.commit();
		} catch (Exception e) {
			tx.rollback();
			sessao.close();
			throw e;
		}finally{
			sessao.close();	
		}
	}
	
	public  void alterar(Produto produto) throws Exception{
		Transaction tx = null;
		Session sessao = HibernateUtility.getSession();
		try {			
			tx = sessao.beginTransaction();
			sessao.update(produto);
			tx.commit();
		} catch (Exception e) {
			tx.rollback();
			sessao.close();
			throw e;
		}finally{
			sessao.close();	
		}
	}

	public void excluir(Produto produto) throws Exception{
		Transaction tx = null;
		Session sessao = HibernateUtility.getSession();
		try {			
			tx = sessao.beginTransaction();
			sessao.delete(produto);
			tx.commit();
		} catch (Exception e) {
			tx.rollback();
			sessao.close();
			throw e;
		}finally{
			sessao.close();	
		}
	}

	public  Produto consultar(String codigoBarras) throws Exception{
		Produto produto = null;
		Session sessao = HibernateUtility.getSession();
		Transaction tx = null;
		try {
			tx = sessao.beginTransaction();
			Query query = sessao.createQuery("from Produto cli where cli.codigoBarras =:codigoBarras");		
			query.setString("codigoBarras", codigoBarras);
			produto = (Produto) query.uniqueResult();			
			tx.commit();			
		} catch (Exception e) {			
			tx.rollback();
			throw e;
		} finally {
			sessao.close();
		}
		return produto;		
	}
	
	public Produto pesquisarPorId(Long id) throws Exception{
		Session sessao = HibernateUtility.getSession();
		try {
			Produto temp = (Produto) sessao.get(Produto.class, id);
			return temp;
		} catch (Exception e) {			
			throw e;
		} finally {
			sessao.close();
		}
	}
	
	@SuppressWarnings("unchecked")
	public List<ProdutoVendido> consultarMaisVendido(Date dataFiltro) throws Exception{
		Session sessao = HibernateUtility.getSession();
		try {
			List<ProdutoVendido> lista = new ArrayList<ProdutoVendido>();
					
			StringBuffer str = new StringBuffer();
			str.append(" SELECT p.nome, sum(i.quantidade) as total ");
			str.append(" FROM agilesystem.itemvenda i ");
			str.append(" left join agilesystem.venda v");
			str.append(" on v.idVenda = i.idVenda");
			str.append(" left join agilesystem.produto p ");
			str.append(" on p.idProduto = i.idProduto ");
			str.append(" where v.data between date");
			str.append(" '"+new SimpleDateFormat("yyyy-MM-dd").format(AsUtils.primeiroDiaDoMes(dataFiltro, true))+"'");
			str.append(" and date");
			str.append(" '"+new SimpleDateFormat("yyyy-MM-dd").format(AsUtils.ultimoDiaDoMes(dataFiltro, true))+"'");
			str.append(" group by i.idProduto ");
			str.append(" order by total desc ");

			Query query = sessao.createSQLQuery(str.toString());
			List<Object[]> temp = query.list();
			for (Object[] object : temp) {
				ProdutoVendido l = new ProdutoVendido();
				l.setDescricao((String)object[0]);
				l.setTotal(new Double(object[1].toString()));
				lista.add(l);
				if(lista.size() == 10) break;
			}
			return lista;
		} catch (Exception e) {			
			throw e;
		} finally {
			sessao.close();
		}
	}

	@SuppressWarnings("unchecked")
	public List<ProdutoVendido> consultarMenosVendido(Date dataFiltro) throws Exception{
		Session sessao = HibernateUtility.getSession();
		try {
			List<ProdutoVendido> lista = new ArrayList<ProdutoVendido>();
			
			StringBuffer str = new StringBuffer();
			str.append(" SELECT p.nome, sum(i.quantidade) as total ");
			str.append(" FROM agilesystem.itemvenda i ");
			str.append(" left join agilesystem.venda v");
			str.append(" on v.idVenda = i.idVenda");
			str.append(" left join agilesystem.produto p ");
			str.append(" on p.idProduto = i.idProduto ");
			str.append(" where v.data between date");
			str.append(" '"+new SimpleDateFormat("yyyy-MM-dd").format(AsUtils.primeiroDiaDoMes(dataFiltro, true))+"'");
			str.append(" and date");
			str.append(" '"+new SimpleDateFormat("yyyy-MM-dd").format(AsUtils.ultimoDiaDoMes(dataFiltro, true))+"'");
			str.append(" group by i.idProduto ");
			str.append(" order by total asc ");
			
			Query query = sessao.createSQLQuery(str.toString());
			List<Object[]> temp = query.list();
			for (Object[] object : temp) {
				ProdutoVendido l = new ProdutoVendido();
				l.setDescricao((String)object[0]);
				l.setTotal(new Double(object[1].toString()));
				lista.add(l);
				if(lista.size() == 10) break;
			}
			return lista;
		} catch (Exception e) {			
			throw e;
		} finally {
			sessao.close();
		}
	}

	@SuppressWarnings("unchecked")
	public  List<Produto> consultarMaisRentavel() throws Exception{
		List<Produto> lista = null;
		Session sessao = HibernateUtility.getSession();
		Transaction tx = null;
		try {
			tx = sessao.beginTransaction();
			Query query = sessao.createQuery(" from Produto p order by p.percentualLucro desc ");
			query.setMaxResults(10);
			lista = query.list();			
			tx.commit();			
		} catch (Exception e) {			
			tx.rollback();
			throw e;
		} finally {
			sessao.close();
		}
		return lista;
	}

	@SuppressWarnings("unchecked")
	public  List<Produto> consultarMaisTrocado() throws Exception{
		List<Produto> lista = null;
		Session sessao = HibernateUtility.getSession();
		Transaction tx = null;
		try {
			tx = sessao.beginTransaction();
			Query query = sessao.createQuery(" from Produto p where p.qtdeTrocado > 0 order by p.qtdeTrocado desc ");
			query.setMaxResults(10);
			lista = query.list();			
			tx.commit();			
		} catch (Exception e) {			
			tx.rollback();
			throw e;
		} finally {
			sessao.close();
		}
		return lista;
	}

}
